package com.dragons.spring5.proxy_jdk;

import com.dragons.spring5.User;
import com.dragons.spring5.dao.UserDao;
import com.dragons.spring5.dao.UserDaoImpl;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;

public class JDKProxy {
    public static void main(String[] args) {

        //newProxyInstance(ClassLoader loader, 类<?>[] interfaces, InvocationHandler h)
        //第一参数，类加载器 -- 通过当前代理对象获取
        //第二参数，增强方法所在的类，这个类实现的接口，支持多个接口
        //第三参数，实现这个接口 InvocationHandler，创建代理对象，写增强的部分

        //创建接口实现类代理对象
        Class[] interfaces = {UserDao2.class};
        // 匿名内部类写法
        //Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new InvocationHandler() {
        //    @Override
        //    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //        return null;
        //    }
        //});
        UserDao2Impl userDaoImpl2 = new UserDao2Impl();
        //new UserDaoProxy(userDaoImpl2) 行代理的对象传进去
        UserDao2 dao = (UserDao2) Proxy.newProxyInstance(JDKProxy.class.getClassLoader(), interfaces, new UserDaoProxy(userDaoImpl2));
        int result = dao.add(1, 2);
        System.out.println("result:"+result);
    }

}
//创建代理对象代码
class UserDaoProxy implements InvocationHandler {
    //1 把创建的是谁的代理对象，把谁传递过来 有参数构造传递
    private Object obj;
    public UserDaoProxy(Object obj) { this.obj = obj; }

    @Override //增强的逻辑
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("方法之前执行...."+method.getName()+" " +
                ":传递的参数..."+ Arrays.toString(args));//方法之前
        Object res = method.invoke(obj, args);//被增强的方法执行
        System.out.println("方法之后执行...."+obj);//方法之后
        return res;
    }
}